﻿/**
 *   Partida: Logica de una partida de juego
 *
 *   Parte de "galaxian-remake"
 *
 *   @see Hardware
 *   @author 1-DAI IES San Vicente 2010/11
 */

/* --------------------------------------------------
   Versiones hasta la fecha:

   Num.   Fecha       Por / Cambios
   ---------------------------------------------------
   0.01  02-Feb-2011  Nacho Cabanes
                      Version inicial: esqueleto, muestra el Nave,
                        permite moverlo a la derecha, izquierda
                        y (vacio) Disparar
   0.02  03-Feb-2011  David Guerra, Javier Abad: Comprobación de colisiones
                      Nacho: se dibuja y mueve el fondo
   0.03  08-Feb-2011  Antonio Pérez, Francisco Royo
                      Creamos un nuevo método llamado inicializar,
                      en el bucle principal inicializamos los datos,
                      añadida tecla provisinal para disparo enemigo.
   0.04  16-Feb-2011  Nacho Cabanes
             		  Adaptado a XNA
   0.05  17-Feb-2011  Daniel Marin
                      Ahora al pulsar Esc se reinician las posiciones de la 
                      flota, Preparar funciones para avanzar de nivel si los enemigos
                      desaparecen
   0.06  18-Feb-2011  Nacho Cabanes
             		  Se avanza de nivel al matar todos los enemigos
                      El disparo del personaje sólo mata un enemigo
 ---------------------------------------------------- */


using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;


    class Partida
    {
        GraphicsDeviceManager graphics;
        ContentManager contenido;

        // Componentes del juego
        Enemigo miEnemigo;
        Personaje miPersonaje;
        Mapa miPantallaJuego;
        Marcador miMarcador;
        AnimacionComienzo miAnimacion;
        int aleatorio;

        // Otros datos del juego
        int puntos;         // Puntuacion obtenida por el usuario
        int contadorBonus;  // Contador usado para decrementar el bonus
        bool terminada;     // Si ha terminado una partida
        System.Random generadorAleatorios;

        public Partida(GraphicsDeviceManager dispositivo, ContentManager contenido)
        {
            
            puntos = 0;
            contadorBonus = 0;
            terminada = false;        
            graphics = dispositivo;
            this.contenido = contenido;

            generadorAleatorios = new System.Random();
        }


        public void LoadContent()
        {
            Reiniciar();
        }


        public void MoverElementos()
        {
            miPersonaje.Mover();
            aleatorio = generadorAleatorios.Next(1, 100);
            if (aleatorio == 1)
                miEnemigo.LanzarBarril();
            miEnemigo.moverBarriles();
        }


        // --- Comprobación de teclas, ratón y joystick -----
        public void ComprobarTeclas()
        {
            // Salir
            if (Keyboard.GetState().IsKeyDown(Keys.Escape))
            {
                Reiniciar();
                terminada = true;
            }
            if (Keyboard.GetState().IsKeyDown(Keys.Right))
                miPersonaje.MoverDerecha();
            if (Keyboard.GetState().IsKeyDown(Keys.Left))
                miPersonaje.MoverIzquierda();

            if (Keyboard.GetState().IsKeyDown(Keys.Up))
                miPersonaje.MoverArriba();

            if (Keyboard.GetState().IsKeyDown(Keys.Down))
                miPersonaje.MoverAbajo();
        }

        
        // --- Comprobar colisiones de enemigo con personaje, etc ---
        public void ComprobarColisiones()
        {
            if (miPersonaje.ColisionCon(miEnemigo))
            {
                miPersonaje.Morir();
                miMarcador.Reiniciar();
            }
            for(int i = 0; i < miEnemigo.getNumBarriles(); i++)
                if (miPersonaje.ColisionCon(miEnemigo.getBarril(i)))
                {
                    miPersonaje.Morir();
                    miMarcador.Reiniciar();
                }

            //Si no quedan vidas restantes, la partida acaba
            if (miPersonaje.GetVidas() == 0)
                terminada = true;
        }


        // --- Dibujar todos los elementos en pantalla
        /*public void DibujarPresentacion(SpriteBatch spriteBatch)
        {
            int contador = 0;
            do
            {
                miAnimacion.DibujarOculta(spriteBatch);
                contador++;
            } while (contador < 20);
        }*/
        public void DibujarElementos(SpriteBatch spriteBatch)
        {
            miMarcador.SetVidas(miPersonaje.GetVidas());
            miMarcador.SetPuntuacion(puntos);
            miMarcador.DibujarOculta(spriteBatch);
            miPersonaje.DibujarOculta(spriteBatch);
            miEnemigo.DibujarOculta(spriteBatch);
            miPantallaJuego.DibujarOculta(spriteBatch);
            for (int i = 0; i < miEnemigo.getNumBarriles(); i++)
                ((Barril)miEnemigo.getBarril(i)).DibujarOculta(spriteBatch);
        }

        public void decrementarBonus()
        {
            if (contadorBonus >= 50)
            {
                miMarcador.ReducirBonus();
                contadorBonus = 0;
            }
            else contadorBonus++;
        }

        public bool GetTerminada()
        {
            return terminada;
        }

        public Mapa GetMapa()
        {
            return miPantallaJuego;
        }


        public void Reiniciar()
        {
            terminada = false;
            miPersonaje = new Personaje(contenido);
            miEnemigo = new Enemigo(contenido);
            miPantallaJuego = new Mapa(contenido);
            miMarcador = new Marcador(contenido);
            miAnimacion = new AnimacionComienzo(contenido);
        }

    }